package com.iflytek.testtoastwindow.utils;

import android.annotation.TargetApi;
import android.app.AppOpsManager;
import android.content.Context;
import android.os.Binder;
import android.os.Build;

/**
 * 
 * <b>权限工具类</b>
 * @author leisu@iflytek.com
 * @since 2015年12月4日 下午5:46:30
 */
public class PermissionUtil 
{
	/**
	 * 
	 * <b>检查权限结果</b>
	 * @author leisu@iflytek.com
	 * @since 2015年12月4日 下午5:43:01
	 */
	public enum CheckPermissionResultType
	{
		/**
		 * 未知
		 */
		RESULT_TYPE_UNKNOW,
		/**
		 * 允许
		 */
		RESULT_TYPE_ALLOW,
		/**
		 * 拒绝
		 */
		RESULT_TYPE_REFUSE,
		/**
		 * 询问
		 */
		RESULT_TYPE_ASK;
	}
	
	/**
	 * 在当前环境中是否可以使用这个工具类
	 * @return
	 */
	public static boolean isCanUse()
	{
		final int version = Build.VERSION.SDK_INT;
		return version >= Build.VERSION_CODES.KITKAT;
	}
	

	@TargetApi(Build.VERSION_CODES.KITKAT)
	public static CheckPermissionResultType checkOp(Context context, int op) {
		final int version = Build.VERSION.SDK_INT;
		CheckPermissionResultType resultType = CheckPermissionResultType.RESULT_TYPE_UNKNOW;
		if (version >= Build.VERSION_CODES.KITKAT) {
			AppOpsManager manager = (AppOpsManager) context
					.getSystemService(Context.APP_OPS_SERVICE);
			try {

				int result = (Integer) Reflection.invokeMethod(
						manager,
						"checkOpNoThrow",
						new Class[] { int.class, int.class, String.class },
						new Object[] { op, Binder.getCallingUid(),
								context.getPackageName() });
				if(result==AppOpsManager.MODE_ALLOWED)
				{
					resultType = CheckPermissionResultType.RESULT_TYPE_ALLOW;
				} else if(result ==AppOpsManager.MODE_IGNORED)
				{
					resultType = CheckPermissionResultType.RESULT_TYPE_REFUSE;
				} else if(result == AppOpsManager.MODE_DEFAULT  || result ==4)
				{
					resultType = CheckPermissionResultType.RESULT_TYPE_ASK;
				} else 
				{
					resultType = CheckPermissionResultType.RESULT_TYPE_UNKNOW;
				}
				
			} catch (Exception e) {
			}
		} else {
		}
		return resultType;
	}

	/**
	 * 悬浮窗权限是否可用
	 *
	 * @return
	 */
	@TargetApi(Build.VERSION_CODES.KITKAT)
	public static CheckPermissionResultType checkFloatWindowAllowed(Context context) {
		return PermissionUtil.checkOp(context, 24);
	}

	/**
	 * 读取联系人权限是否可用
	 *
	 * @return
	 */
	@TargetApi(Build.VERSION_CODES.KITKAT)
	public static CheckPermissionResultType checkReadContactAllowed(Context conetext) {
		return PermissionUtil.checkOp(conetext, 4);
	}
}
